#============================================
# #知识点 
# 基本语句
#针对库的增删改查(文件夹)
#create database;                             增库
#create database 库名 charset ="编码类型";     增库（指定编号）
#show databases;                              查所有库
#show create database 库名;                   查单个库
#alter database 库名 charset = "编码类型";     修改库的编码
#drop database 库名;                          删除指定库

#针对表的增删改查(文件)
# 在操作表时，需要自定的库
#select database();                          查看所在的库
#use 库名;                                   切换这个库
#create table 表名(id int,name char(4))      创建一个表 括号内为表头信息
#create table 绝对路径(库名.表名(id int,name char(4)))  绝对路径创建
#show tables                                查看所有表
#show create table 表名                      查看单个表
#describe 表名                               查看表的详细
#alter table 表名 modify name char(6)        修改表头属性
#alter table 表名 modify name char(6) (first|after 字段名)  修改表头属性 以及位置
#alter table 表名字 add 字段名 字段类型 约束 位置       添加字段
#alter table op add qwq int(20) unique first;        添加字段
#alter table op drop 字段名;                  删除一个字段
#alter table op change 旧字段名 新字段名 新字段类型    修改字段名
#drop table 表名                             删除表
#drop table 绝对路径                         绝对路径删除
#alter table 表名 drop foreign key 外键名     删除外键，外键名为show create table 表明 \g所展示名字


#针对数据的增删改查(一行行数据)
#insert into 表名(字段名) values(1,"fbh");               在表中增加数据
#insert into 表名 values(1,"fbh"),(2,"xxx")       增加多个
#select * from 表名                               查看表中的数据(不建议在数量大的情况使用)
#select 属性 from 表名                            根据属性查找
#select 属性 from 表名  where 条件                         根据属性查找
#update 表名 set name = "fbh" where 条件(id = 2)   根据条件改数据
#delete from 表名 where 条件                       根据条件删数据           
#delete from 表名 where name = "fbh"               根据条件删数据
#delete from t1                                    清空表数据


# mysql函数(一些)
# 数学函数 abs()绝对值  sqrt()平方根 log()对数函数 sin()正弦函数
# 字符串函数 replace()替换 reverse()逆序 
# 时间函数 NOW()此时时间 week()获取星期数


#创建表的约束
# primary key 主键 
# auto_incremnet 自增
# unique唯一
# enum('0','1') 枚举  只能选一个
# set(0,1)  集合 可以选多个
# default  默认值
# not null 非空
# foreign key 外键 s_id int(10) 
# foreign key(s_id) references qwq(id) on update cascade on delete cascade


# 查询所用的操作符
# in              (not)
# between and     (not)
# like %匹配任意多个 _匹配一个  (not)
#  and
#  or
# limit
# is null  (not)


# 聚合函数
# count()  max() min() sum() avg()

# 算数函数
# round() abs() mod()


#字符串函数
# lower()  upper()  lenght()  concat() replace()


#日期函数
# curdate() 返回当前的日期(年-月-日)。
# curtime() 返回当前的时间(时-分-秒)。
# current_timestamp()  返回当前的时间(年-月-日 时-分-秒)
# timestampdiff函数，有参数设置，对于比较的两个时间，时间小的放在前面，时间大的放在后面。
# timestampdiff(DAY, '2020-07-01 23:59:00', '2020-07-03 00:00:00');

#条件判断函数
# case when
# case when 用于计算条件列表的表达式，并返回条件对应的结果。通俗一点讲就是“如果……就……”。
# 语法：
# case 
# when condition_1 then result_1
# when condition_2 then result_2
# …
# else result_n
# end

# 例如：
# 当 sex=‘1’ 时，性别为‘男’；当 sex=‘0’ 时，性别为‘女’；
# case 
# when sex='1' then '男'
# when sex='0' then '女'(这个when可以多个，看情况使用)
# else '其他'		# else 可有可无
# end
# as '性别';	# 新的列名为‘性别’




#查询的方法排序
#   select distinct 字段1, 字段2,... from 表名
#   where   分组之前的筛选条件
#   group by 分组条件  group_concat()
#   with rollup 在统计出来的数据最后一行加一个总和
#   having    分组之后的筛选条件
#   order by   排序字段1 asc,排序字段2 desc
#   1imit 5,5   第一项起始位置美的个位置取多少


# union  去除重复数据   加法
# union all 不去除重复数据
# (select * from score where 课程号 = '0001' order by 成绩  desc limit 2)
# union all
# (select * from score where 课程号 = '0002' order by 成绩  desc limit 2)
# union all
# (select * from score where 课程号 = '0003' order by 成绩  desc limit 2);


# 内连接 inner join:返回俩表字段相同的数据
# select supp.s_id,supp.s_name,f_name,f_price from fruits inner join supp on fruits.s_id=supp.s_id;
# select 字段名字 from 表1 inner join 表2 on 表1.字段名字 = 表2.字段名字 (一般on的字段名是一样的，或者是主外键)
# 这样就可以查俩张表的共同内容,注意俩个表的字段名字一样时候，要给他们做区分：表1.s_id 或者 表2.s_id

#自连接是特殊的内连接(看表就明白了)
# select * from fruits as f1,fruits as f2;
# 笛卡尔乘积是由笛卡尔发现的这种现象，在数学中指集合A、B的结果集；
# 在mysql中指X、Y表的所有集合。x条数据乘y条数据就是总数据。
# 笛卡尔乘积
# SQL连接查询时若表A有m行，表B有n行则select * from A,B 产生的结果行数为m*n行。

# 外连接
# 左连接 left join:返回包括左表中所有的数据和右表中连接字段相同的数据(没有的用null表示)
# 右连接 right join:返回包括右表中所有的数据和 左表中连接字段相同的数据(没有的用null表示)

#  select s_city as '城市',sum(f_price) as prices,group_concat(f_name) as 'name'
#  from supp inner join fruits on supp.s_id = fruits.s_id 
#  where f_price between 3 and 25 
#  group by s_city  
#  having sum(f_price)>5 
#  order by sum(f_price) 
#  limit 3;


#子查询可以多个嵌套在一起,拿一个查询结果去套另一个查询
#子查询连接关键词 any in all exists,

# any 和 all 一般是跟在比较操作符
# any后面只要里面有一个满足就会返回
# all后面所有满足才会会返回
#tab1:1,2,15,20
#tab2:1,3,13,16
#select * from tab1 where num1 > any(select * from tab2)   结果 2,15,20  大于集合中的其中一个就返回
#select * from tab1 where num1 > all(select * from tab2)   结果 20      大于集合中所有的之才返回


# exists 和 in 后面都跟一个子查询(not)
# exsits 判断子查询，如果子查询有结果，就进行外层查询，如果子查询没有结果，就不进行外层查询
# in 子查询返回一个数据列，这个数据列将给外插叙语句进行使用操作。

#也可以使用比较运算符

# 1、关联子查询的执行逻辑完全不同于正常的SELECT语句。
# 2、关联子查询执行逻辑如下：
# （1）先从主查询的Product表中product _type列取出第一个值，进入子查询中，得到子查询结果，然后返回父查询，判断父查询的where子句条件，则返回整个语句的第1条结果。
# （2）重复上述操作，直到所有主查询中的Product表中product _type列记录取完为止。得出整个语句的结果集，就是最后的答案。


# 需求:“选取出各商品种类中高于该商品种类的平均销售单价的商品。”
# 关联子查询SELECT语句：
# select 
# 	* 
# from 
# 	product as p1 
# where 
# 	p1.sale_price > 
# 	(
# 		select 
# 			avg(sale_price) 
# 		from 
# 			product as p2 
# 		where 
# 			p2.product_type = p1.product_type
# 		group by
# 			p2.product_type
# 	)


# 1.先执行主查询

# SELECT 
# 	product _type , product_name, sale_price
# FROM 
# 	Product AS P1


# 2.从主查询中product_type中先取第一个值"衣服",通过WHERE P1.product_type = P2.product_type传入子查询
# 子查询变为:

# SELECT 
# 	AVG(sale_price)
# FROM 
# 	Product AS P2
# WHERE 
# 	P2.product_type = '衣服'
# GROUP BY 
# 	product_type



# 从子查询得到的结果AVG(sale_price)=2500，返回主查询：

# SELECT 
# 	product_type, 
# 	product_name,
# 	sale_price
# FROM 
# 	Product AS P1
# WHERE 
# 	sale_price > 2500 
# AND 
# 	product_type = '衣服'
